『ゼロから作るDeep Learning 3 ―フレームワーク編』
hr.icon
目次
各章ページに読書メモを書いています
第1ステージ 微分を自動で求める
ステップ1 箱としての変数
1.1 変数とは
1.2 Variableクラスの実装
1.3 【補足】NumPyの多次元配列
ステップ2 変数を生み出す関数
2.1 関数とは
2.2 Functionクラスの実装
2.3 Functionクラスを使う
ステップ3 関数の連結
3.1 Exp関数の実装
3.2 関数を連結する
ステップ4 数値微分
4.1 微分とは
4.2 数値微分の実装
4.3 合成関数の微分
4.4 数値微分の問題点
ステップ5 バックプロパゲーションの理論
5.1 チェインルール
5.2 バックプロパゲーションの導出
5.3 計算グラフで表す
ステップ6 手作業によるバックプロパゲーション
6.1 Variableクラスの追加実装
6.2 Functionクラスの追加実装
6.3 SquareとExpクラスの追加実装
6.4 バックプロパゲーションの実装
ステップ7 バックプロパゲーションの自動化
7.1 逆伝播の自動化のために
7.2 逆伝播を試す
7.3 backwardメソッドの追加
ステップ8 再帰からループへ
8.1 現時点のVariableクラス
8.2 ループを使った実装
8.3 動作確認
ステップ9 関数をより便利に
9.1 Pythonの関数として利用
9.2 backwardメソッドの簡略化
9.3 ndarrayだけを扱う
ステップ10 テストを行う
10.1 Pythonのユニットテスト
10.2 square関数の逆伝播のテスト
10.3 勾配確認による自動テスト
10.4 テストについてのまとめ
コラム :自動微分
第2ステージ 自然なコードで表現する
ステップ11 可変長の引数(順伝播編)
11.1 Functionクラスの修正
11.2 Addクラスの実装
ステップ12 可変長の引数(改善編)
12.1 1つ目の改善:関数を使いやすく
12.2 2つ目の改善:関数を実装しやすく
12.3 add関数の実装
ステップ13 可変長の引数(逆伝播編)
13.1 可変長引数に対応したAddクラスの逆伝播
13.2 Variableクラスの修正
13.3 Squareクラスの実装
ステップ14 同じ変数を繰り返し使う
14.1 問題の原因
14.2 解決策
14.3 微分をリセットする
ステップ15 複雑な計算グラフ(理論編)
15.1 逆伝播の正しい順番
15.2 現状のDeZero
15.3 関数の優先度
ステップ16 複雑な計算グラフ(実装編)
16.1 世代の追加
16.2 世代順に取り出す
16.3 Variableクラスのbackward
16.4 動作確認
ステップ17 メモリ管理と循環参照
17.1 メモリ管理
17.2 参照カウント方式のメモリ管理
17.3 循環参照
17.4 weakrefモジュール
17.5 動作確認
ステップ18 メモリ使用量を減らすモード
18.1 不要な微分は保持しない
18.2 Functionクラスの復習
18.3 Configクラスによる切り替え
18.4 モードを切り替える
18.5 with文による切り替え
ステップ19 変数を使いやすく
19.1 変数に名前を付ける
19.2 ndarrayのインスタンス変数
19.3 len関数とprint関数
ステップ20 演算子のオーバーロード(1)
20.1 Mulクラスの実装
20.2 演算子のオーバーロード
ステップ21 演算子のオーバーロード(2)
21.1 ndarrayと一緒に使う
21.2 floatやintと一緒に使う
21.3 問題点1:左項がfloatやintの場合
21.4 問題点2:左項がndarrayインスタンスの場合
ステップ22 演算子のオーバーロード(3)
22.1 負数
22.2 引き算
22.3 割り算
22.4 累乗
ステップ23 パッケージとしてまとめる
23.1 ファイル構成
23.2 コアクラスへの移し替え
23.3 演算子のオーバーロード
23.4 実際の__init__.pyファイル
23.5 dezeroのインポート
ステップ24 複雑な関数の微分
24.1 Sphere関数
24.2 matyas関数
24.3 Goldstein-Price関数
コラム :Define-by-Run
第3ステージ 高階微分を実現する
ステップ25 計算グラフの可視化(1)
25.1 Graphvizのインストール
25.2 DOT言語でグラフを書く
25.3 ノードの属性を指定する
25.4 ノードを結ぶ
ステップ26 計算グラフの可視化(2)
26.1 可視化コードの使用例
26.2 計算グラフからDOT言語への変換
26.3 画像化までを含めた変換
26.4 動作確認
ステップ27 テイラー展開の微分
27.1 sin関数の実装
27.2 テイラー展開の理論
27.3 テイラー展開の実装
27.4 計算グラフの可視化
ステップ28 関数の最適化
28.1 ローゼンブロック関数
28.2 微分を求める
28.3 勾配降下法の実装
ステップ29 ニュートン法を用いた最適化(手計算)
29.1 ニュートン法による最適化の理論
29.2 ニュートン法による最適化の実装
ステップ30 高階微分(準備編)
30.1 確認作業①:Variableのインスタンス変数
30.2 確認作業②:Functionクラス
30.3 確認作業③:Variableクラスの逆伝播
ステップ31 高階微分(理論編)
31.1 逆伝播で行う計算
31.2 逆伝播で計算グラフを作る方法
ステップ32 高階微分(実装編)
32.1 新しいDeZeroへ
32.2 関数クラスの逆伝播
32.3 より効率的な逆伝播へ(モードの追加)
32.4 __init__.pyの変更
ステップ33 ニュートン法を使った最適化(自動計算)
33.1 2階微分を求める
33.2 ニュートン法による最適化
ステップ34 sin関数の高階微分
34.1 sin関数の実装
34.2 cos関数の実装
34.3 sin関数の高階微分
ステップ35 高階微分の計算グラフ
35.1 tanh関数の微分
35.2 tanh関数の実装
35.3 高階微分の計算グラフの可視化
ステップ36 高階微分以外の用途
36.1 doublebackpropの用途
36.2 ディープラーニングの研究での使用例
コラム :ニュートン法とdoublebackpropの補足
第4ステージ ニューラルネットワークを作る
ステップ37 テンソルを扱う
37.1 要素ごとの計算
37.2 テンソルを使用したときのバックプロパゲーション
37.3 【補足】テンソルを使用したときのバックプロパゲーション
ステップ38 形状を変える関数
38.1 reshape関数の実装
38.2 Variableからreshapeを使う
38.3 行列の転置
38.4 【補足】実際のtranspose関数
ステップ39 和を求める関数
39.1 sum関数の逆伝播
39.2 sum関数の実装
39.3 axisとkeepdims
ステップ40 ブロードキャストを行う関数
40.1 broadcast_to関数とsum_to関数
40.2 DeZeroのbroadcast_toとsum_to関数
40.3 ブロードキャストへの対応
ステップ41 行列の積
41.1 ベクトルの内積と行列の積
41.2 行列の形状チェック
ステップ42 線形回帰
42.1 トイ・データセット
42.2 線形回帰の理論
42.3 線形回帰の実装
42.4 【補足】DeZeroのmean_squared_error関数
ステップ43 ニューラルネットワーク
43.1 DeZeroのlinear関数
43.2 非線形なデータセット
43.3 活性化関数とニューラルネットワーク
43.4 ニューラルネットワークの実装
ステップ44 パラメータをまとめるレイヤ
44.1 Parameterクラスの実装
44.2 Layerクラスの実装
44.3 Linearクラスの実装
44.4 Layerを使ったニューラルネットワークの実装
ステップ45 レイヤをまとめるレイヤ
45.1 Layerクラスの拡張
45.2 Modelクラス
45.3 Modelを使って問題を解く
45.4 MLPクラス
ステップ46 Optimizerによるパラメータ更新
46.1 Optimizerクラス
46.2 SGDクラスの実装
46.3 SGDクラスを使って問題を解く
46.4 SGD以外の最適化手法
ステップ47 ソフトマックス関数と交差エントロピー誤差
47.1 スライス操作のための関数
47.2 ソフトマックス関数
47.3 交差エントロピー誤差
ステップ48 多値分類
48.1 スパイラル・データセット
48.2 学習用のコード
ステップ49 Datasetクラスと前処理
49.1 Datasetクラスの実装
49.2 大きいデータセットの場合
49.3 データの連結
49.4 学習用のコード
49.5 データセットの前処理
ステップ50 ミニバッチを取り出すDataLoader
50.1 イテレータとは
50.2 DataLoaderを使う
50.3 accuracy関数の実装
50.4 スパイラル・データセットの学習コード
ステップ51 MNISTの学習
51.1 MNISTデータセット
51.2 MNISTの学習
51.3 モデルの改良
コラム :ディープラーニングのフレームワーク
第5ステージ DeZeroで挑む
ステップ52 GPU対応
52.1 CuPyのインストールと使用方法
52.2 cudaモジュール
52.3 Variable/Layer/DataLoaderクラスの追加実装
52.4 関数の追加実装
52.5 GPUでMNISTを学習
ステップ53 モデルの保存と読み込み
53.1 NumPyのsave関数とload関数
53.2 Layerクラスのパラメータをフラットに
53.3 Layerクラスのsave関数とload関数
ステップ54 Dropoutとテストモード
54.1 Dropoutとは
54.2 InvertedDropout
54.3 テストモードの追加
54.4 Dropoutの実装
ステップ55 CNNのメカニズム(1)
55.1 CNNのネットワーク構造
55.2 畳み込み演算
55.3 パディング
55.4 ストライド
55.5 出力サイズの計算方法
ステップ56 CNNのメカニズム(2)
56.1 3階テンソル
56.2 ブロックで考える
56.3 ミニバッチ処理
56.4 プーリング層
ステップ57 conv2d関数とpooling関数
57.1 im2colによる展開
57.2 conv2d関数の実装
57.3 Conv2dレイヤの実装
57.4 pooling関数の実装
ステップ58 代表的なCNN(VGG16)
58.1 VGG16の実装
58.2 学習済み重みデータ
58.3 学習済みのVGG16を使う
ステップ59 RNNによる時系列データ処理
59.1 RNNレイヤの実装
59.2 RNNモデルの実装
59.3 「つながり」を切るためのメソッド
59.4 サイン波の予測
ステップ60 LSTMとデータローダ
60.1 時系列データのためのデータローダ
60.2 LSTMレイヤの実装
コラム :これから先へ
付録A インプレース演算(ステップ14の補足)
A.1 問題の確認
A.2 コピーと上書きについて
A.3 DeZeroの逆伝播では
付録B get_item関数の実装(ステップ47の補足)
付録C GoogleColaboratoryで動かす
おわりに
参考文献
索引